// ===========   File : ArryStack.h =============//

/*
    基于数组实现的栈的数据结构，为了不用处理数组扩容的问题，我们使用动态数组来构建这个栈
*/
#include <stdio.h>
#include <stdlib.h>
#include "ArryStack.h"


#define MAX_SIZE    32              /* 定义栈的大小 */


/* 
    构造函数
*/
ArryStack *NewArryStack(void) 
{
    ArryStack *Stack = malloc(sizeof(ArryStack));           /* 创建一个数组栈的对象 */

    Stack->data = malloc(sizeof(int) * MAX_SIZE);           /* 为数组创建一个内存 */
    Stack->size = 0;                                        /* 初始化长度为0 */
    return Stack;
}

/* 
    析构函数
    stack:一个栈的对象
*/
void DelArryStack(ArryStack *stack)
{
    free(stack->data);
    free(stack);
}

/* 
    获取栈的长度 
    stack:一个栈的对象
*/
int ArryStackSize(ArryStack *stack)
{
    return stack->size;
}

/* 
    判断是否为空
    stack:一个栈的对象
*/
_Bool ArryStackIsEmpty(ArryStack *stack)
{
    return stack->size ==0;
}

/* 
    入栈
    stack:一个栈的对象
*/
void ArryStackPush(ArryStack *stack,int num)
{
    if(stack->size == MAX_SIZE) {
        printf("stack is full \n");
        return ;
    }

    stack->data[stack->size] = num;
    stack->size++;
}


/* 
    访问栈顶元素
    stack:一个栈的对象    
*/
int ArryStackPeek(ArryStack *stack)
{
    if(stack->size == 0) {
        printf("stack is empty\n");
        return INT_MAX;
    }
    return stack->data[stack->size - 1];
}

/* 
    出栈
    stack:一个栈的对象
*/
int ArryStackPop(ArryStack *stack)
{
    if(stack->size == 0) {
        printf("stack is empty\n");
        return INT_MAX;
    }

    int val = ArryStackPeek(stack);
    stack->size--;
    return val;
}

/* 
    打印栈的状态
     stack:一个栈的对象
*/
void ArryStackPrintf(ArryStack *stack)
{
    if(ArryStackIsEmpty(stack)) {
        printf("stack is empty.\n");
        return;
    }

    printf("栈顶的值：%d\n",ArryStackPeek(stack));
    printf("栈的长度：%d \n",ArryStackSize(stack));
    for(int i=0;i<ArryStackSize(stack);i++)
    {
        printf("栈内[%d]节点的值：%d\n",i,stack->data[i]);
    }
}


/* main 主函数 */
int main(int argc, char * argv[])
{
    printf("================== 创建栈 打印栈的状态 ===================\n");
    ArryStack *Stack = NewArryStack();
    ArryStackPrintf(Stack);

    printf("================== 第一次添加数据 打印栈的状态 ===================\n");
    ArryStackPush(Stack,100);
    ArryStackPrintf(Stack);

    printf("================== 第二次添加数据 打印栈的状态 ===================\n");
    ArryStackPush(Stack,200);
    ArryStackPrintf(Stack);

    printf("================== 第三次添加数据 打印栈的状态 ===================\n");
    ArryStackPush(Stack,500);
    ArryStackPrintf(Stack);

    printf("================== 第一次数据出栈 打印栈的状态 ===================\n");
    ArryStackPop(Stack);
    ArryStackPrintf(Stack);

    printf("================== 第二次数据出栈 打印栈的状态 ===================\n");
    ArryStackPop(Stack);
    ArryStackPrintf(Stack);

    printf("================== 第三次数据出栈 打印栈的状态 ===================\n");
    ArryStackPop(Stack);
    ArryStackPrintf(Stack);

}

